#include "user.h"

// 用户登录
void user_login(Sql_list *L)
{
    system("clear");
    puts("请登录");
    char name[128] = " ";
    char password[128] = " ";
    int num = 0; // 用于记录输入错误的次数
    while (1)
    {
        puts("欢迎来到此登录系统，请输入你的账号(输错三次进入进度条)");
        printf("请输入用户名：");
        scanf("%s", name);
        printf("请输入密码：");
        scanf("%s", password);
        for (size_t i = 0; i < L->User_len; i++)
        {
            if (!strcmp(name, L->User[i].name) && !strcmp(password, L->User[i].password))
            {
                puts("登录成功");
                root_menu(L);
                return;
                // break;
            }
            if (i == L->User_len - 1)
            {
                puts("账号错误");
                num++; // 记录用户输入错误的次数
            }
        }
        if (num == 3)
        {
            num = 0;                // 错误次数请0
            Progress_Bar(0, 0, 10); // 打印进度条
        }
    }
}

// 用户注册
void user_add(Sql_list *L)
{
    puts("请注册");
    char name[128];
    char password[128];
    printf("请输入用户名：");
    scanf("%s", name);
    printf("请输入密码：");
    scanf("%s", password);
    for (size_t i = 0; i < L->User_len; i++)
    {
        if (!strcmp(name, L->User[i].name))
        {
            printf("用户名已存在\n");
            return;
        }
    }
    if (NULL == L)
    {
        printf("表 NULL\n");
        return;
    }
    strcpy(L->User[L->User_len].name, name);
    strcpy(L->User[L->User_len].password, password);
    L->User_len++;
    printf("注册成功\n");
}
// 添加用户名和密码
void  user_register(Sql_list *L)
{
    char name[128];
    char password[128];
    printf("请输入用户名：");
    scanf("%s", name);
    printf("请输入密码：");
    scanf("%s", password);
    for (size_t i = 0; i < L->User_len; i++)
    {
        if (!strcmp(name, L->User[i].name))
        {
            printf("用户名已存在\n");
            return;
        }
    }
    if (NULL == L)
    {
        printf("表 NULL\n");
        return;
    }
    strcpy(L->User[L->User_len].name, name);
    strcpy(L->User[L->User_len].password, password);
    L->User_len++;
    printf("添加成功\n");
}
// 查看用户名和密码
void printf_User_List(Sql_list *L)
{
    printf("|序号\t|名字\t\t|密码\t\t|\n");
    // 数据
    for (size_t i = 0; i < L->User_len; i++)
    {
        printf("|%ld\t|名字:%s\t|密码:%s\t|\n", i + 1, L->User[i].name, L->User[i].password);
    }
}

// 修改用户名和密码
void change_User(Sql_list *L)
{
    printf("请输入要修改的用户名：");
    char name[128];
    scanf("%s", name);
    for (size_t i = 0; i < L->User_len; i++)
    {
        if (!strcmp(name, L->User[i].name))
        {
            printf("请输入新的密码：");
            scanf("%s", L->User[i].password);
            printf("修改成功\n");
            return;
        }
    }
    printf("用户名不存在\n");
}

// 删除用户名和密码
void delete_User(Sql_list *L)
{
    printf("请输入要删除的用户名：");
    char name[128];
    scanf("%s", name);
    for (size_t i = 0; i < L->User_len; i++)
    {
        if (!strcmp(name, L->User[i].name))
        {
            for (size_t j = i; j < L->User_len - 1; j++)
            {
                L->User[j] = L->User[j + 1];
            }
            L->User_len--;
            printf("删除成功\n");
            return;
        }
    }
}

// 进度条
void Progress_Bar(int x, int y, float time_length)
{
    float flag = 0;                          // 当前进度时间
    float total_length = 20;                 // 进度条总长度
    float mean = time_length / total_length; // 平均数
    float temp = 0;                          // 和平均数对比
    float percent = 0;                       // 用于显示百分比
    int num = 0;                             // 控制进度条符号的个数

    while (1)
    {

        if (fabs(temp - mean) < EPSILON) // 使用fabs计算浮点数差值的绝对值fabs 函数的原型如下：double fabs(double x);
        {
            num++;
            temp = 0;
        }
        for (size_t i = 0; i < y; i++)
        {
            putchar('\n');
        }
        for (size_t i = 0; i < x; i++)
        {
            putchar(' ');
        }

        putchar('[');
        for (size_t i = 0; i < num; i++)
        {
            printf(">");
        }
        for (size_t i = 0; i < total_length - num; i++)
        {
            printf(" ");
        }
        putchar(']');
        percent = ((time_length / 100) * flag) * 100;
        printf("%.2f%%\n", percent);
        temp += 0.01;
        flag += 0.01;
        if (fabs((flag - 0.01) - time_length) < EPSILON)
        {
            break;
        }

        // 监控数据

        // printf("\n%.2f", flag);
        // printf("\n%.2f", time_length);
        // printf("\n%.2f", temp);
        // printf("\n%.2f", mean);
        // printf("\n%d", num);

        fflush(stdout);
        usleep(10000);
        system("clear");
    }
    system("clear");
}
void main_menu(Sql_list *L)
{
    int choice;
    while (1)
    {
        puts("*******************************************");
        puts("***$$$$$$      欢迎进入本系统      $$$$$$**");
        puts("********         1.登录            ********");
        puts("********         2.注册            ********");
        puts("********         3.退出            ********");
        puts("*******************************************");
        puts("请输入你的选择：");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            user_login(L);
            break;
        case 2:
            user_register(L);
            main_menu(L);
            break;
        case 3:
            break;
        default:
            puts("没有此选项");
        }
    }
}
void root_menu(Sql_list *L )
{
    int choice;
    while (1)
    {
        printf("1.添加用户名和密码\n");
        printf("2.查看用户名和密码\n");
        printf("3.修改用户名和密码\n");
        printf("4.删除用户名和密码\n");
        printf("5.添加学生信息\n");
        printf("6.删除最后一名学生的信息\n");
        printf("7.按名字修改学生成绩\n");
        printf("8.按名字查找学生信息\n");
        printf("8.查看所有学生信息\n");
        printf("请输入你的选择：");
        scanf("%d", &choice);
        printf("=============================================\n");
        switch (choice)
        {
        case 1:
            user_register(L);
            printf("=============================================\n");
            break;
        case 2:
            printf_User_List(L);
            printf("=============================================\n");
            break;
        case 3:
            change_User(L);
            printf("=============================================\n");
            break;
        case 4:
            delete_User(L);
            printf("=============================================\n");
            break;
        case 5:
            cmdtail_insert_tail(L);
            printf("=============================================\n");
            break;
        case 6:
           tail_del_list(L);
           printf("=============================================\n");
            break;
        case 7:
            find_by_name(L);
            printf("=============================================\n");
            break;
        case 8:
            printf_Sql_List(L);
            printf("=============================================\n");
            break;
        default:
            printf("输入错误，请重新输入\n");
            printf("=============================================\n");
            break;
        }
    }
}

